text: Stop drag updates when a dnd starts
authorMatthias Clasen <mclasen@redhat.com>
Sun, 6 Sep 2020 16:19:44 +0000 (12:19 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 6 Sep 2020 16:19:44 +0000 (12:19 -0400)
This prevents the selection from changing underneath
us, messing up move dnd operations.

gtk/gtktext.c

index 6af06f39fee8ac9bfc3a7b3a3246f0f9efa3edb3..7e2f2308ebe470e2349f16a7e524199a518c699e 100644 (file)
@@ -2910,6 +2910,16 @@ dnd_finished_cb (GdkDrag *drag,
   priv->drag = NULL;
 }
 
+static void
+dnd_cancel_cb (GdkDrag             *drag,
+               GdkDragCancelReason  reason,
+               GtkText             *self)
+{
+  GtkTextPrivate *priv = gtk_text_get_instance_private (self);
+
+  priv->drag = NULL;
+}
+
 static void
 gtk_text_drag_gesture_update (GtkGestureDrag *gesture,
                               double          offset_x,
@@ -2973,6 +2983,7 @@ gtk_text_drag_gesture_update (GtkGestureDrag *gesture,
           g_object_unref (content);
 
           g_signal_connect (drag, "dnd-finished", G_CALLBACK (dnd_finished_cb), self);
+          g_signal_connect (drag, "cancel", G_CALLBACK (dnd_cancel_cb), self);
 
           paintable = gtk_text_util_create_drag_icon (widget, text, -1);
           gtk_drag_icon_set_from_paintable (drag, paintable, ranges[0], 0);
@@ -2986,6 +2997,9 @@ gtk_text_drag_gesture_update (GtkGestureDrag *gesture,
           g_free (text);
 
           priv->in_drag = FALSE;
+
+          /* Deny the gesture so we don't get further updates */
+          gtk_gesture_set_state (priv->drag_gesture, GTK_EVENT_SEQUENCE_DENIED);
         }
     }
   else